package com.clx.admin.service;

import com.clx.common.domain.dto.FileUploadChunkDto;
import com.clx.common.domain.entity.DiskFile;
import com.clx.common.domain.vo.AjaxResult;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 文件表(File)表服务接口
 *
 * @author clx
 * @since 2025-01-07 17:48:09
 */
public interface FileService {
    /**
     * 根据主键查询单个实体
     *
     * @param id 主键
     * @return 对应实体对象
     */
    DiskFile selectFileById(Long id);

    /**
     * 查询实体列表
     *
     * @param file 实体对象（可作为筛选条件）
     * @return 实体对象集合
     */
    List<DiskFile> selectFileList(DiskFile file);

    /**
     * 新增实体
     *
     * @param file 要新增的实体对象
     * @return 受影响的行数，新增成功通常返回1，失败返回0等
     */
    int insertFile(DiskFile file);

    /**
     * 修改实体
     *
     * @param file 要修改的实体对象
     * @return 受影响的行数，一般成功修改返回1
     */
    int updateFile(DiskFile file);

    /**
     * 批量删除实体
     *
     * @param ids 需要删除的实体主键数组
     * @return 受影响的行数，即成功删除的记录数
     */
    int deleteFileByIds(Long[] ids);

    /**
     * 删除单个实体（通过主键删除）
     *
     * @param id 主键
     * @return 受影响的行数，成功删除返回1
     */
    int deleteFileById(Long id);


    /**
     * 分页查询
     */
    List<DiskFile> paging(int pageNum, int pageSize,int index);

    /**
     * 上传分块文件
     *
     */
    AjaxResult upload(FileUploadChunkDto fileUploadChunkDto);


    /**
     * 合并分片
     */
    AjaxResult merge( FileUploadChunkDto fileUploadChunkDto);



    /**
     * 根据用户id查询文件
     */
    AjaxResult selectFile();
    /**
     * 返回文件类型对应的list
     */
    AjaxResult selectByType(Long index);

    /**
     * 搜索功能
     * @param value
     * @return
     */
    List<DiskFile> searchByFile(String value,int pageNum, int pageSize);



    /**
     * 合并文件夹分块
     */
    AjaxResult mergeChunks(FileUploadChunkDto fileUploadChunkDto);


    /**
     * 根据文件的相对路径，把文件夹创建
     * @param params
     * @return
     */
    AjaxResult getFolderName(Map<String, String> params);

    /**
     * 通过文件夹名称获取文件内容
     * @param folderName
     * @param filePath
     * @return
     */
    List<DiskFile> listObjects(String filePath, String folderName,int pageNum,int pageSize);


    /**
     * 根据Id返回上一级
     * @param id
     * @return
     */
    AjaxResult returnToParent(Long id);



    /**
     * 删除文件以及文件夹到回收站(修改状态)
     */
    AjaxResult update(List<DiskFile> fileList);

    /**
     * 删除文件
     * @param
     * @return
     */
    AjaxResult move(List<DiskFile> fileList);


    /**
     * 文件小于5mb直接上传
     */
    AjaxResult uploadSmall(FileUploadChunkDto fileUploadChunkDto);


    /**
     * 下载文件
     * @param list
     * @return
     */
    void downLoad(List<DiskFile> list, HttpServletResponse response);


    /**
     * 新建文件夹
     * @param folderName
     * @return
     */
    AjaxResult newFolder(String folderName,Long parentId);
    /**
     * 恢复回收站文件
     * @param
     * @return
     */
    AjaxResult recover(List<DiskFile> fileList);

    /**
     * 重命名
     * @param
     * @return
     */
    AjaxResult rename(DiskFile file);
}
